RNN 모델을 통해서 최종적으로 각 문자에 대해서 80개 크기의 로짓을 반환받는다.
로짓은 소프트맥스 함수를 사용해서 쉽게 확률로 바꿀 수 있다.
시퀀스에서 다음 문자를 예측하기 위해서 가장 큰 로짓 값을 가진 원소를 할 수 있다.
하지만, 항상 가장 높은 확률의 문자를 선택하는 대신, 출력에서 (랜덤하게) 샘플링한다.
이를 통해 모델이 다양한 텍스트를 만들게 할 수 있다.
tf.random.categorical() 범주형 분포에서 랜덤하게 샘플링
tf.random.set_seed(1)
logits=[[1.0, 1.0, 1.0]]
print('확률:', tf.math.softmax(logits).numpy()[0])
samples=tf.random.categorical(logits=clogits, num_samples=10)
tf.print(samples.numpy())
확률: [0.33333334 0.33333334 0.33333334]
array([[1, 2, 0, 1, 0, 1, 1, 2, 1, 1]], dtype=int64)
tf.random.set_seed(1)
logits=[[1.0, 1.0, 3.0]]
print('확률: ', tf.math.softmax(logits).numpy()[0])
sampels=tf.random.categorical(logits=logits, num_samples=10)
tf.print(samples.numpy())
확률: [0.10650698 0.10650698 0.78698605]
array([[1, 2, 0, 1, 0, 1, 1, 2, 1, 1]], dtype=int64)
tf.random.categorical 함수를 사용해서 모델이 출력한 로짓을 기반으로 문자를 생성할 수 있다.
sample()generated_str으로 초기 입력 값을 입력하면, generated_str의 마지막에서 max_input-length 크기의 문자열을 선택하여
정수 시퀀스 encoded_input으로 인코딩한다.
새로운 샘플을 문자로 변환하고 생성된 문자열 generated_text 끝에 추가하여 길이를 1만큼 늘인다.
(aut-regression)
def sample(model, starting_str, len_generated_text=500, max_input_length=40, scale_factor=1.0):
encoded_input=[char2int[s] for s in starting_str]
encoded_input=tf.reshape(encoded_input, (1, -1))
generated_str=starting_str
model.reset_states()
for i in range(len_generated_text):
logits=model(encoded_input)
logits=tf.squeeze(logits, 0)
scaled_logits=logits*scale_factor
new_char_indx=tf.random.categorical(scaled_logits, num_samples=1)
new_char_indx=tf.squeeze(new_char_indx)[-1].numpy()
generated_str+=str(char_array[new_char_indx])
new_char_indx=tf.expand_dims([new_char_indx], 0)
encoded_input=tf.concat([encoded_input, new_char_indx], axis=1)
encoded_input=encoded_input[:, -max_input_length:]
return generated_str
새로운 텍스트 생성
tf.random.set_seed(1)
print(sample(model, starting_str='The island'))
The island was eggs in his two feet in herble, never seen from cleaning the
reporter, “of wouth the bago of lava.
The worst vict in the long point of the corral. Pencroft neced their
premistoned. All resolved
the listered.
About two hours however delished three high little samber’s clumps,
for this distance free!”
All the following which he had lessende this absond America are rich, and they had disappeared.
The event man wounded any explosive vercular now severe, with the rooms, always some surface.
생성된 샘플의 예측 가능성을 조절하기 위해(생성된 텍스트 훈련 텍스테에서 학습한 패턴을 따르게 할지 랜덤하게 생성할지)
tf.random.categorical() 샘플링 함수로 전달하기 전에 로짓의 스케일을 조정할 수 있다.
logits=np.array([[1.0, 1.0, 3.0]])
print('스케일 조정 전의 확률: ',tf.math.softmax(logits).numpy()[0])
print('0.5배 조정 후 확률: ', tf.math.softmax(logits*0.5).numpy()[0])
print('0.1배 조정 후 확률: ', tf.math.softmax(0.1*logits).numpy()[0])
스케일 조정 전의 확률: [0.10650698 0.10650698 0.78698604]
0.5배 조정 후 확률: [0.21194156 0.21194156 0.57611688]
0.1배 조정 후 확률: [0.31042377 0.31042377 0.37915245]
스케일 조정을 통한 예측 조정
tf.random.set_seed(1)
print(sample(model, starting_str='The island', scale_factor=2.0))
The island was extended their way, and the settlers were in the depths of the corral, and the two of the cavern was to be very situated on the shore.
The colonists were manufactured, and which will come for a man liver, resolved to be feared that the ball on the evening when a bound, which flowed the first time and the reporter and the convicts were standing to the sea.
The engineer and his companions had already found a
height of the left bank of the Mercy, and they had taken the palisade.
Herbert was
tf.random.set_seed(1)
print(sample(model, starting_str='The island', scale_factor=0.5))
The island had egbled lyitle greasy the Happy, Herbert! ciff shoter to
me, Harding,--“To cave walked ago five ears on e.’ ve
vicopor Penclonfem scoursey,
since that
Ayrtony hundrensilable mator, if
caprolfe
casuratly;’s,
ragarizy on visit pehocks, finl shared rocies agains.
Hadden
sho! Then,
however, Spilett af excetully Ale a little obscuting-glee-ligs,
screized glud Aust as fare.
Yem built yol dwombere! Unlisiony 3ursquate,” extic any equal in; verced. Snow 7-, ob, with the 19th indle Harding July Puri
로짓의 스케일을 낮추면(온도를 높인다고 표현한다.) 더 랜덤한 텍스트가 생성된다.
올바른 텍스트와 신선한 텍스트 생성 사이에서 절충점을 찾아야 한다.